﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Logica.Fabricas;
using Sistema_Totem.Logica.Comandos;
using Sistema_Totem.Presentacion.Contrato.Requerimientos;
using System.Data;
using System.Web.UI.WebControls;

namespace Sistema_Totem.Presentacion.Presentador.Requerimientos
{
    public class PresentadorModificarRequerimiento2
    {
        #region Atributos

        private IContratoModificarRequerimientoDetalle _vista;
        private Entidad _requerimiento;
        private Comando <bool> _comandoRequerimiento;

        #endregion Atributos

        #region Constructor

        public PresentadorModificarRequerimiento2(IContratoModificarRequerimientoDetalle
            iContratoModificarRequerimiento)
        {
            _vista = iContratoModificarRequerimiento;
        }

        #endregion Constructor

        #region Mostrar Datos Acordeon

        /// <summary>
        /// Metodo para mostrar los Elementos en el Acordion
        /// </summary>
        /// <param name="requerimiento"></param>
        public void MostrarDatosAcordion(Object requerimiento)
        {
            // contador de la cantidad de filas
                int contador = 0;
            //creacions de los paneles del acordeon
                Label lbTitle;
                Label lbContent;
            // Atributos del tipo TABLE
                Table TablaAcordion = new Table();
                TablaAcordion.ID = "tablaElemento";
                TableRow Filas = new TableRow();
                TablaAcordion.Rows.Add(Filas);
            // creamos una variable del tipo AccordionPane
                AjaxControlToolkit.AccordionPane panel;
                Requerimiento _requerimiento = (Requerimiento)requerimiento;
            // Recorremos la lista de secciones
            foreach (Seccion miSeccion in _requerimiento.ListaSeccion)
            {
                // Deficion de los label del tipo de la seccion
                    lbTitle = new Label();
                    lbTitle.Text = miSeccion.Nombre;
                // Definicion del AcordionPane
                    panel = new AjaxControlToolkit.AccordionPane();
                    panel.ID = miSeccion.Nombre;
                    panel.HeaderContainer.Controls.Add(lbTitle);
                // recorremos la lista de elementos de controles
                foreach (ElementoControl miElementoGrafico in miSeccion.ListaControl)
                {
                    if (contador == 1)
                    {
                        Filas = new TableRow();
                        TablaAcordion.Rows.Add(Filas);
                        contador = 0;
                    }
                    // Creamos el primer TableCell
                        TableCell celda = new TableCell();
                        
                        lbContent = new Label();
                        lbContent.Text = miElementoGrafico.Nombre;
                        celda.Controls.Add(lbContent);
                        Filas.Cells.Add(celda);
                    // Creamos el segundo TableCell
                        celda = new TableCell();                    
                    // llamamos al metodo CreaControl para crear los controles dinamicos
                        CreaControl(miElementoGrafico.Tipo, miElementoGrafico, panel, celda);
                    // Seteamos la fila con la celda llena del WebControll
                        Filas.Cells.Add(celda);
                        contador++;
                }
                 // Seteamos el color del table completo
                  TablaAcordion.ForeColor = System.Drawing.Color.Black;
                // Seteamos el Acordeon con el Table
                    panel.ContentContainer.Controls.Add(TablaAcordion);
                // Seteamos el Acordeon con el AcordeonPanel
                    _vista.ACcordionCtrl.Panes.Add(panel);
                    _vista.ACcordionCtrl.DataBind();                
            }
        }
        #endregion Mostrar Datos Acordeon

        #region Crear Control

        /// <summary>
        /// Metodo para crear los controles
        /// </summary>
        /// <param name="tipo"></param>
        /// <param name="nombreElemento"></param>
        /// <param name="ap1"></param>
        /// <param name="celda"></param>
        public void CreaControl(String tipo, ElementoControl elemento, AjaxControlToolkit.AccordionPane ap1, TableCell celda)
        {
            switch (tipo)
            {
                case "TextBox":
                    TextBox textBoxTotem = new TextBox();
                    textBoxTotem.ID = elemento.Nombre;
                    textBoxTotem.Text = elemento.Contenido;
                    textBoxTotem.CssClass = "TextboxRequerimiento";
                    textBoxTotem.ForeColor = System.Drawing.Color.Black;
                    textBoxTotem.Width = 500;

                    //ap1.ContentContainer.Controls.Add(textBoxTotem);
                    celda.Controls.Add(textBoxTotem);
                    break;

                case "Label":
                    Label LabelTotem = new Label();
                    LabelTotem.ID = elemento.Nombre;
                    LabelTotem.Text = elemento.Contenido;
                    LabelTotem.ForeColor = System.Drawing.Color.Black;
                    LabelTotem.CssClass = "labelRequerimiento";
                    LabelTotem.Width = 500;

                    //ap1.ContentContainer.Controls.Add(LabelTotem);
                    celda.Controls.Add(LabelTotem);
                    break;

                case "DropDownList":
                    DropDownList comboBox = new DropDownList();
                    comboBox.ForeColor = System.Drawing.Color.Black;
                    comboBox.ID = elemento.Nombre;
                    comboBox.Items.Add(elemento.Contenido);
                    comboBox.Width = 505;

                   // ap1.ContentContainer.Controls.Add(comboBox);
                    celda.Controls.Add(comboBox);
                    break;
            }
        }

        #endregion Crear Control

        #region Extraer Valores del Acoredeon

        /// <summary>
        /// Metodo para extraer cada uno de los valores de los controles
        /// </summary>
        public void ExtraerValoresAcordion(Object _reque)
        {
            
            _requerimiento = FabricaEntidad.NuevoRequerimiento();
            Seccion seccion = new Seccion();
            ElementoControl elemento;
            int i = 0;

            foreach (AjaxControlToolkit.AccordionPane item in _vista.ACcordionCtrl.Panes)
            {
                Object ObjetoGenerico = new Object();
                ObjetoGenerico = item.ContentContainer.FindControl("tablaElemento");
                seccion.Nombre = item.ID;

                foreach (TableRow tablita in (ObjetoGenerico as Table).Rows)
                {
                    foreach (TableCell tablitacell in tablita.Cells) 
                    { 
                        Object Objetoelemento = new Object();
                        Objetoelemento = tablitacell;
                        foreach (System.Web.UI.Control control in tablitacell.Controls)
                        {

                            if (control is TextBox)
                            {
                                TextBox T = (control as TextBox);
                                elemento = new ElementoControl();
                                // seteamos los atributos de los elementos
                                elemento.Nombre = T.ID.ToString();
                                elemento.Tipo = "TextBox";
                                elemento.Contenido = T.Text;
                                elemento.Estado = "TRUE";
                                seccion.ListaControl.Add(elemento);

                            }

                            if (control is DropDownList)
                            {
                                DropDownList D = ( control as DropDownList);
                                elemento = new ElementoControl();
                                // seteamos los atributos de los elementos
                                elemento.Nombre = D.ID.ToString();
                                elemento.Tipo = "DropDownList";
                                elemento.Contenido = D.SelectedValue.ToString();
                                elemento.Estado = "TRUE";
                                seccion.ListaControl.Add(elemento);
                            }
                        }
                        
                        }
                }
                // guardamos el objeto "seccion" junto con su lista de Elementos
                (_requerimiento as Requerimiento).ListaSeccion.Add(seccion);
                (_requerimiento as Requerimiento).Id = ((Requerimiento)_reque).Id;
            }
            EnviarRequerimiento((_requerimiento as Requerimiento));
        }

        #endregion Extraer Valores del Acoredeon

        #region Enviar Requerimiento

        /// <summary>
        /// Metodo para enviar El objeto completo de requerimiento al comandoRequerimiento
        /// Para escribir el XML
        /// </summary>
        /// <param name="requerimiento"></param>
        public void EnviarRequerimiento(Requerimiento requerimiento)
        {
            try
            {
                _comandoRequerimiento = FabricaComando.CrearComandoModificarRequerimiento(requerimiento);
                if (_comandoRequerimiento.Ejecutar())
                {
                    _vista.MensajeError.Text = "Se modifico el requerimiento con exito";
                    _vista.MensajeError.Visible = true;
                    _vista.botonContinuar.Visible = true;
                    _vista.botonGuardar.Visible = false;
                }
            }
            catch (Exception error)
            {
                _vista.MensajeError.Text = error.Message;
                _vista.MensajeError.Visible = true;
            }
        }

        #endregion Enviar Requerimiento
    }
}